﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Business.Entities;
using Business.Logic;

namespace UI.Desktop
{
    public partial class MateriasDesktop : ApplicationForm
    {
        private List<Plan> _ListaPlanes;

        public List<Plan> ListaPlanes
        {
            get { return _ListaPlanes; }
            set { _ListaPlanes = value; }
        }

        private Business.Entities.Materias _MateriaActual=new Materias();

        private Business.Entities.Materias MateriaActual
        {
            get 
            { 
                return _MateriaActual; 
            }
            set { _MateriaActual=value;}
        }

        #region Constructores

        public MateriasDesktop()
        {
            InitializeComponent();
        }

        //dar alta a una Materia
        public MateriasDesktop(ModoForm modo, List<Plan> Lista): this()
        {
            ListaPlanes = Lista;
            this.Modo = modo;
            MapearDeDatos();
        }

        //modificar o eliminar Materia
        public MateriasDesktop(int ID, ModoForm modo, List<Plan> Lista): this()
        {
            try
            {
                ListaPlanes = Lista;
                this.Modo = modo;
                MateriaLogic matlog = new MateriaLogic();
                MateriaActual = matlog.GetOne(ID);
                MapearDeDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                this.Close();
            }
        }

        #endregion

        #region Eventos

        private void ABMCMaterias_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet.planes' Puede moverla o quitarla según sea necesario.
            this.planesTableAdapter.Fill(this.tp2_netDataSet.planes);

            foreach (Plan p in ListaPlanes)
            {
                cmbIDPlan.Items.Add(p.Descripcion);
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Modo != ModoForm.Consulta)
                {
                    if (Validar() != false)
                    {
                        MapearADatos();
                        GuardarCambios();
                        switch (Modo)
                        {
                            case ModoForm.Alta:
                                MessageBox.Show("La materia fue registrada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                break;
                            case ModoForm.Modifica:
                                MessageBox.Show("La materia fue modificada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                            case ModoForm.Baja:
                                MessageBox.Show("La materia fue eliminada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                        }
                        btnCancelar.Text = "Cerrar";
                    }
                }
                else
                {
                    MapearADatos();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }
        
        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion

        #region Métodos

        protected override void MapearDeDatos()
        {
            if (ModoForm.Alta != this.Modo)
            {
                this.txtID.Text = Convert.ToString(MateriaActual.ID);
                this.txtDescripcion.Text = MateriaActual.Descripcion;
                this.txtHsSemanales.Text = MateriaActual.HSSemanales.ToString() ;
                this.txthsTotales.Text = MateriaActual.HSTotales.ToString();
                this.cmbIDPlan.Text = BuscarPlan();
            }
            switch (this.Modo)
            {
                case ModoForm.Alta: btnAceptar.Text = "Guardar";
                    break;
                case ModoForm.Baja: btnAceptar.Text = "Eliminar";
                    txthsTotales.ReadOnly = true;
                    txtHsSemanales.ReadOnly = true;
                    txtDescripcion.ReadOnly = true;
                    txtID.ReadOnly = true;
                    cmbIDPlan.Enabled = false;
                    break;
                case ModoForm.Modifica: btnAceptar.Text = "Guardar Cambios";
                    break;
                case ModoForm.Consulta: btnAceptar.Text = "Aceptar";
                    txthsTotales.ReadOnly = true;
                    txtHsSemanales.ReadOnly = true;
                    txtDescripcion.ReadOnly = true;
                    txtID.ReadOnly = true;
                    cmbIDPlan.Enabled = false;
                    break;
            }
        }

        private string BuscarPlan()
        {
            string DescPlan = "";
            foreach (Plan p in ListaPlanes)
            {
                if (MateriaActual.IDPlan == p.ID)
                {
                    DescPlan = p.Descripcion;
                }
            }
            return DescPlan;
        }

        private int BuscarIdPlan()
        {
            int idPlan = 0;
            foreach (Plan p in ListaPlanes)
            {
                if (cmbIDPlan.Text.Trim() == p.Descripcion)
                {
                    idPlan = p.ID;
                }
            }
            return idPlan;
        }

        protected override void MapearADatos()
        {
                try
                {
                    switch (Modo)
                    {
                        case ModoForm.Alta:
                            Materias mat = new Materias();
                            mat.Descripcion = txtDescripcion.Text;
                            mat.HSSemanales = int.Parse(txtHsSemanales.Text);
                            mat.HSTotales = int.Parse(txthsTotales.Text);
                            mat.IDPlan = BuscarIdPlan();
                            mat.State = Materias.States.New;
                            MateriaActual = mat;
                            break;

                        case ModoForm.Consulta:
                            MateriaActual.ID = Convert.ToInt32(txtID.Text.Trim());
                            MateriaActual.Descripcion = txtDescripcion.Text;
                            MateriaActual.HSSemanales = int.Parse(txtHsSemanales.Text);
                            MateriaActual.HSTotales = int.Parse(txthsTotales.Text);
                            MateriaActual.IDPlan = BuscarIdPlan();
                            MateriaActual.State = Materias.States.Unmodified;
                            break;

                        case ModoForm.Modifica:
                            MateriaActual.ID = Convert.ToInt32(txtID.Text.Trim());
                            MateriaActual.Descripcion = txtDescripcion.Text;
                            MateriaActual.HSSemanales = int.Parse(txtHsSemanales.Text);
                            MateriaActual.HSTotales = int.Parse(txthsTotales.Text);
                            MateriaActual.IDPlan = BuscarIdPlan();
                            MateriaActual.State = Materias.States.Modified;
                            break;

                        case ModoForm.Baja:
                            MateriaActual.ID = Convert.ToInt32(txtID.Text.Trim());
                            MateriaActual.State = Materias.States.Deleted;
                            break;
                    }
                }
                catch (FormatException fe)
                {
                    throw fe;
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
            
        protected override void GuardarCambios()
        {
            try
            {
                MateriaLogic MatLogic = new MateriaLogic();
                if (this.Modo != ModoForm.Baja)
                    MatLogic.Save(MateriaActual);
                else
                    MatLogic.Delete(MateriaActual);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override bool Validar()
        {
            ValidacionesEspeciales val = new ValidacionesEspeciales();
            string mensaje = "";
                if (txtDescripcion.Text == "")
                    mensaje += "- Debe completar el campo Descripción" + "\n";
                if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtDescripcion.Text.Trim()))
                    mensaje += "- El campo Descripción contiene símbolos" + "\n";
                if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtDescripcion.Text.Trim()))
                    mensaje += "- El campo Descipción tiene más de 50 caracteres" + "\n";
                if (txtHsSemanales.Text == "")
                    mensaje += "- Debe completar el campo Horas semanales" + "\n";
                if (txthsTotales.Text == "")
                    mensaje += "- Debe completar el campo Horas totales" + "\n";
                if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esNumero, txtHsSemanales.Text))
                    mensaje += "- El campo Hs Semanales debe ser un entero\n";
                if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esNumero, txthsTotales.Text))
                    mensaje += "- El campo horas totales debe ser un entero\n";

                if (mensaje == "")
                    return true;
                else
                {
                    MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    return false;
                }           
        }

        #endregion

        
    }
}
